package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ISocDifferenceDAO;
import org.jsola.hr.dto.BachDifferenceDTO;
import org.jsola.hr.dto.SocDifferenceAddDTO;
import org.jsola.hr.dto.SocDifferenceUpdateDTO;
import org.jsola.hr.entity.SocDifferenceDO;
import org.jsola.hr.query.SocDifferenceQuery;
import org.jsola.hr.vo.SocDifferenceListVO;
import org.jsola.hr.vo.SocDifferenceVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 员工参保差额费用记录
 *
 * @author zhr
 */
public interface ISocDifferenceService extends IService<ISocDifferenceDAO, SocDifferenceDO> {

    /**
     * 新增员工参保差额费用记录
     *
     * @param socDifferenceAddDTO 新增员工参保差额费用记录DTO
     * @param tokenUser           当前用户
     * @return 员工参保差额费用记录详情信息
     */
    SocDifferenceVO save(SocDifferenceAddDTO socDifferenceAddDTO, TokenUser tokenUser);

    /**
     * 修改员工参保差额费用记录
     *
     * @param socDifferenceUpdateDTO 修改员工参保差额费用记录DTO
     * @param tokenUser              当前用户
     * @return 更新数量
     */
    int update(SocDifferenceUpdateDTO socDifferenceUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工参保差额费用记录，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser        当前用户
     * @param socDifferenceIds 员工参保差额费用记录id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... socDifferenceIds);

    /**
     * 根据员工参保差额费用记录id查找
     *
     * @param socDifferenceId 员工参保差额费用记录id
     * @param siteId          所属站点id
     * @return 员工参保差额费用记录详情信息
     */
    SocDifferenceVO selectById(String socDifferenceId, String siteId);

    /**
     * 查询员工参保差额费用记录
     *
     * @param socDifferenceQuery 查询条件
     * @param siteId             所属站点id
     * @return 员工参保差额费用记录列表信息
     */
    List<SocDifferenceListVO> select(SocDifferenceQuery socDifferenceQuery, String siteId);

    /**
     * 查询员工参保差额费用记录记录数
     *
     * @param socDifferenceQuery 查询条件
     * @param siteId             所属站点id
     * @return 员工参保差额费用记录记录数
     */
    int selectCount(SocDifferenceQuery socDifferenceQuery, String siteId);

    /**
     * 分页查询员工参保差额费用记录
     *
     * @param socDifferenceQuery 查询条件
     * @param siteId             所属站点id
     * @return 员工参保差额费用记录列表信息
     */
    Page<SocDifferenceListVO> selectPage(SocDifferenceQuery socDifferenceQuery, String siteId);


    /**
     * 根据员工参保差额费用记录id查找
     *
     * @param socDifferenceId 员工参保差额费用记录id
     * @param siteId          所属站点id
     * @return 员工参保差额费用记录
     */
    SocDifferenceDO selectDOById(String socDifferenceId, String siteId);

    /**
     * 查询员工参保差额费用记录
     *
     * @param socDifferenceQuery 查询条件
     * @param siteId             所属站点id
     * @return 员工参保差额费用记录列表
     */
    List<SocDifferenceDO> selectDO(SocDifferenceQuery socDifferenceQuery, String siteId);

    /**
     * 根据参保月查询参保月内的差额费用记录
     *
     * @param monthId   参保月Id
     * @param tokenUser 当前用户
     * @return 员工参保差额费用记录列表
     */
    List<SocDifferenceDO> selectByMonthId(String monthId, TokenUser tokenUser);

    /**
     * 根据参保记录查询的差额费用记录
     *
     * @param socInfoIdList 参数
     * @param siteId        站点
     * @return 员工参保差额费用记录列表
     */
    List<SocDifferenceDO> selectBySocInfoIdList(List<String> socInfoIdList, String siteId);

    /**
     * 批量添加差额费用记录
     *
     * @param bachDifferenceDTO 参数
     * @param tokenUser         当前用户
     */
    void bachDifference(BachDifferenceDTO bachDifferenceDTO, TokenUser tokenUser);

    /**
     * 查询员工某参保月有没有缴纳某种差额费用
     *
     * @param empId          员工Id
     * @param differenceName 差额费用名称
     * @param monthId        参保月id
     * @param tokenUser      当前用户
     * @return 差额费用记录
     */
    List<SocDifferenceDO> selectByEmpAndName(String empId, String differenceName, String monthId, TokenUser tokenUser);

    /**
     * 查询用工单位下某个月份的所有差额费用
     *
     * @param companyIdList 用工单位Id
     * @param monthIdList   月份Id列表
     * @param siteId        站点
     * @return 差额费用记录
     */
    List<SocDifferenceDO> selectByMonthAndCompanyList(List<String> companyIdList, List<String> monthIdList,
                                                      String siteId);

    /**
     * 查询租户下的所有差额费用
     *
     * @param tokenUser 当前用户
     * @return 差额费用
     */
    List<SocDifferenceDO> selectBySite(TokenUser tokenUser);
}


